<?php

namespace app\common\library\device\cabinet;

use app\common\model\mycurrency\Device;
use think\Hook;
use think\Log;

/**
 * 指令解析组装类
 */
class Analysis
{
    const CODE_KAIMEN                   = 22;//通讯指令  = 【服务器=>设备】下发开柜门指令
    const CODE_KAIMENSONGDA             = 21;//通讯指令  = 【设备=>服务器】设备应答服务器指令
    const CODE_KAIMENZHIXING            = 23;//通讯指令  = 【设备=>服务器】设备应答服务器开门执行结果
    const CODE_GEKOUZHUAGNTAI           = 20;//通讯指令  = 【设备=>服务器】设备上报归还执行结果
    const CODE_CHAXUNZHUANGTAI          = 24;//通讯指令  = 【服务器=>设备】下发查询柜门状态指令
    const CODE_ZHUANGTAIYINGDA          = 25;//通讯指令  = 【设备=>服务器】设备应答服务器查询结果（设备应答柜门状态查询）
    //const CODE_                       = 30;//通讯指令  = 【服务器=>设备】服务器下发订单查询指令
    //const CODE_                       = 31;//通讯指令  = 【设备=>服务器】设备应答订单查询
    const CODE_CHAXUNCHUANGANQI         = 50;//通讯指令  = 【服务器=>设备】开关传感器状态查询指令
    const CODE_YINGDACHUANGGANQI        = 51;//通讯指令  = 【设备=>服务器】应答开关传感器状态查询
    const CODE_CHAXUNWANGLUO            = 100;//通讯指令 = 【服务器=>设备】查询网络指令
    const CODE_YINGDAWANGLUO            = 101;//通讯指令 = 【设备=>服务器】网络查询结果应答
    const CODE_SHANGXIAN                = 102;//通讯指令 = 【设备=>服务器】设备上线消息
    const CODE_LIXIAN                   = 103;//通讯指令 = 【设备=>服务器】设备离线消息
    //const CODE_                       = 104;//通讯指令 = 【设备=>服务器】设备心跳上报使能
    const CODE_XINTIAO                  = 105;//通讯指令 = 【设备=>服务器】设备心跳包
    const CODE_KAIDENG                  = 108;//通讯指令 = 【服务器=>设备】服务器下发灯开关指令
    const CODE_KAIDENGYINGDA            = 109;//通讯指令 = 【设备=>服务器】服务器下发灯开关指令应答
    const CODE_BUKA                     = 110;//通讯指令 = 【服务器=>设备】服务器下发读卡指令
    const CODE_DUKAYINGDA               = 111;//通讯指令 = 【设备=>服务器】设备应答id卡号

    const CODE_NETWORK_1                = 200;//修改网络配置
    const CODE_XINTIAO_PEIZHI           = 104;//心跳配置


    //接收到的数据格式
    public static $structure = [
        '21' => [//设备应答服务器指令
            ['filed_name' => 'type','explain' => '类型:借用开柜门/还回开柜门'],
            ['filed_name' => 'number','explain' => '柜门编号'],
            ['filed_name' => 'frequency','explain' => '开门次数'],
        ],
        '23' => [//设备应答服务器开门执行结果
            ['filed_name' => 'result','explain' => '执行结果状态'],
            ['filed_name' => 'number','explain' => '柜门编号'],
            ['filed_name' => 'quantity','explain' => '出货数量'],
        ],
        '20' => [//设备上报归还执行结果
            ['filed_name' => 'result','explain' => '执行结果状态'],
            ['filed_name' => 'number','explain' => '柜门编号'],
            ['filed_name' => 'infrared_status','explain' => '红外遮挡状态'],
            ['filed_name' => 'block_id','explain' => 'nfc卡id'],
        ],
        '24' => [//设备应答服务器查询结果（应答服务器下发查询柜门状态指令）
            ['filed_name' => 'state_str','explain' => '状态代码'],
        ],
        '25' => [//设备应答服务器查询结果（应答服务器下发查询柜门状态指令）
            ['filed_name' => 'state_str','explain' => '状态代码'],
        ],
        '31' => [//设备应答订单查询
            ['filed_name' => 'state','explain' => '订单状态'],
        ],
        '51' => [//设备应答开关传感器状态查询
            //['filed_name' => 'state','explain' => '状态'],
            ['filed_name' => 'cabinet_state_1','explain' => '格口1'],
            ['filed_name' => 'cabinet_state_2','explain' => '格口2'],
            ['filed_name' => 'cabinet_state_3','explain' => '格口3'],
            ['filed_name' => 'cabinet_state_4','explain' => '格口4'],
            ['filed_name' => 'cabinet_state_5','explain' => '格口5'],
            ['filed_name' => 'cabinet_state_6','explain' => '格口6'],
            ['filed_name' => 'cabinet_state_7','explain' => '格口7'],
            ['filed_name' => 'cabinet_state_8','explain' => '格口8'],
        ],
        '101' => [//设备应答服务器查询结果(应答 服务器下发查询网络指令)
            ['filed_name' => 'rssi','explain' => '信号强度（ 0—31,99 没 信 号 ），-113dBm+（rssi*2）'],
            ['filed_name' => 'iccid','explain' => '卡唯一标识 ICCID'],
            ['filed_name' => 'net','explain' => '网络通讯模式'],
            ['filed_name' => 'hdver','explain' => '硬件版本'],
            ['filed_name' => 'swver','explain' => '软件版本'],
        ],
        '102' => [//设备上线消息
            ['filed_name' => 'rssi','explain' => '信号强度（ 0—31,99 没 信 号 ），-113dBm+（rssi*2）'],
            ['filed_name' => 'iccid','explain' => '卡唯一标识 ICCID'],
            ['filed_name' => 'net','explain' => '网络通讯模式'],
            ['filed_name' => 'dev','explain' => '设备型号'],
        ],
        '103' => [//设备离线消息
            ['filed_name' => 'rssi','explain' => '信号强度（ 0—31,99 没 信 号 ），-113dBm+（rssi*2）'],
            ['filed_name' => 'iccid','explain' => '卡唯一标识 ICCID'],
            ['filed_name' => 'net','explain' => '网络通讯模式'],
            ['filed_name' => 'dev','explain' => '设备型号'],
        ],
        '105' => [//设备心跳包
            ['filed_name' => 'rssi','explain' => '信号强度（ 0—31,99 没 信 号 ），-113dBm+（rssi*2）'],
            ['filed_name' => 'iccid','explain' => '卡唯一标识 ICCID'],
            ['filed_name' => 'net','explain' => '网络通讯模式'],
            ['filed_name' => 'dev','explain' => '设备型号'],
        ],
        '109' => [//开关灯控制指令应答
            ['filed_name' => 'number','explain' => '柜门编号'],
            ['filed_name' => 'result','explain' => '执行结果状态'],
        ],
        '110' => [//读卡指令应答
            //['filed_name' => 'card_number','explain' => '读卡指令'],
            ['filed_name' => 'card_number_1','explain' => '格口1'],
            ['filed_name' => 'card_number_2','explain' => '格口2'],
            ['filed_name' => 'card_number_3','explain' => '格口3'],
            ['filed_name' => 'card_number_4','explain' => '格口4'],
            ['filed_name' => 'card_number_5','explain' => '格口5'],
            ['filed_name' => 'card_number_6','explain' => '格口6'],
            ['filed_name' => 'card_number_7','explain' => '格口7'],
            ['filed_name' => 'card_number_8','explain' => '格口8'],
        ],
        '111' => [//读卡指令应答
            //['filed_name' => 'card_number','explain' => '读卡指令'],
            ['filed_name' => 'card_number_1','explain' => '格口1'],
            ['filed_name' => 'card_number_2','explain' => '格口2'],
            ['filed_name' => 'card_number_3','explain' => '格口3'],
            ['filed_name' => 'card_number_4','explain' => '格口4'],
            ['filed_name' => 'card_number_5','explain' => '格口5'],
            ['filed_name' => 'card_number_6','explain' => '格口6'],
            ['filed_name' => 'card_number_7','explain' => '格口7'],
            ['filed_name' => 'card_number_8','explain' => '格口8'],
        ],
    ];




    /**
     * 指令解析
     * @param string $messageJson 收到的数据
    */
    public static function analysis($messageJson){
        $information = json_decode($messageJson,true);
        $data_str = $information['m'];//收到的消息内容
        if ($information['c'] == self::CODE_KAIMENSONGDA || $information['c'] == self::CODE_KAIMENZHIXING){//21开门指令发送到设备 or 23开门执行结果  第一个分隔符逗号 第二个分隔符&
            $a = explode('&',$data_str);
            $b = explode(',',$a[0]);
            $data = [$b[0],$b[1],$a[1]];

        }elseif ($information['c'] == self::CODE_GEKOUZHUAGNTAI){//柜门状态发生变化  所有分隔符是逗号
            $data = explode(',',$data_str);
        }
        else{//所有&符号分割的指令
            $data = explode('&',$data_str);
        }
        $data_arr = [];
        foreach ($data as $k => $v){
            $data_arr[self::$structure[$information['c']][$k]['filed_name']] = $v;
        }
        return [
            'code' => $information['c'],
            'from' => $information['f'],
            'to' => $information['t'],
            'saleid' => $information['s'],
            'message_id' => $information['mi'],
            'message' => $data_arr,
        ];
    }

    /**
     * 指令组装 - 应答
     * @param int $comdid 指令响应id
     * @param int $count 接收到数据包的 count值
     * @param array $data 要发送的数据
    */
    public static function assembelResponse($comdid,$count,$data){

    }

    /**
     * 指令组装 - 发送数据
     * @param int $code 通讯指令
     * @param int $device_id 设备id【根据设备id生成 发送方id，接收方id，message_id】
     * @param array $data 要发送的数据
     */
    public static function sendingAssemble($code,$device_id,$data = []){
        $device = Device::get($device_id);
        if (!$device){
            return false;
        }
        $from = "TAIQIU001";//发送方
        $to = "{$device->serial_number}";//接收方id
        $saleid = "1";
        //消息ID号
        if ($device->message_id == null || $device->message_id == 0){
            $message_id = 1;
        }else{
            $message_id = $device->message_id + 1;
        }
        //消息内容
        $message = $data;
        //if (count($data) > 0){
        //    $message = implode('&',$data);
        //}
        $content = [
            'c' => $code,
            'f' => $from,
            't' => $to,
            'm' => $message,
            's' => $saleid,
            'mi' => $message_id,
        ];
        return $content;
    }

    /**
     * 更新message_id
     * @param int $device_id 设备id
     * @param int $message_id 消息id号
    */
    public static function messageidUpdate($device_id,$message_id){
        Device::where(['id' => $device_id])->update([
            'message_id' => $message_id,
        ]);
    }

}
